package ar.fiuba.tp7552.buildadmin.webactions.gastos;

import java.math.BigDecimal;
import java.util.Date;

import ar.fiuba.tp7552.buildadmin.model.builds.Edificio;
import ar.fiuba.tp7552.buildadmin.model.gastos.Gasto;
import ar.fiuba.tp7552.buildadmin.model.gastos.GastoReal;
import ar.fiuba.tp7552.buildadmin.model.gastos.Prevision;
import ar.fiuba.tp7552.buildadmin.model.gastos.TipoGasto;

/**
 * Value Object para manejar la herencia que hay para los
 * gastos. Desde el Action de Struts se utiliza esta clase para
 * pasar los parametros y combretirlo en GastoReal o Prevesion
 * segun corresponda. 
 */
public class GastoVO {

	private static final String PREVISION = "Prevision";
	private static final String REAL = "GastoReal";
	
	// Atributos comunes de Gastos
	private Long id;
	private String hierarchy;// si es GastoReal o Prevision
	private BigDecimal monto;
	private String detalle;
	private String folio;
	private Boolean consolidado;
	private TipoGasto tipo;
	private Edificio edificio;
	
	// Atributos de gasto real
	private String razonSocial;
	private String nroFactura;
	private Date fecha;
	private String formaPago;
	
	// Atributos de prevision
	private Integer anio;
	private Integer mes;
	private Gasto gasto;
	
	// ~~ Constructor ====================================================
	
	public GastoVO() {}
	
	public GastoVO(GastoReal gasto) {
		this((Gasto)gasto);
		this.razonSocial = gasto.getRazonSocial();
		this.nroFactura = gasto.getNroFactura();
		this.fecha = gasto.getFecha();
		this.formaPago = gasto.getFormaPago();
	}
	
	public GastoVO(Prevision gasto) {
		this((Gasto)gasto);
		this.mes = gasto.getMes();
		this.anio = gasto.getAnio();
	}
	
	private GastoVO(Gasto gasto) {
		this.id = gasto.getId();
		this.monto = gasto.getMonto();
		this.detalle = gasto.getDetalle();
		this.folio = gasto.getFolio();
		this.consolidado = gasto.getConsolidado();
		this.hierarchy = gasto.getClass().getSimpleName();
		this.edificio = gasto.getEdificio();
		this.tipo = gasto.getTipo();
		this.gasto = gasto;
	}
	
	
	
	public Gasto get() {
		if (hierarchy == null) {
			throw new IllegalStateException("No se especifico la clase de gasto");
		} else if (hierarchy.equalsIgnoreCase(PREVISION)) {
			Prevision prev = null;
			if (gasto == null) {
				gasto = new Prevision();
			}
			prev = (Prevision) gasto;
			prev.setMes(this.mes);
			prev.setAnio(this.anio);
			gasto = prev;
		} else if (hierarchy.equalsIgnoreCase(REAL)) {
			GastoReal greal = null;
			if (gasto == null) {
				gasto = new GastoReal();
			} 
			greal = (GastoReal) gasto;
			greal.setRazonSocial(this.razonSocial);
			greal.setNroFactura(this.nroFactura);
			greal.setFormaPago(this.formaPago);
			greal.setFecha(this.fecha);
			gasto = greal;
		}
		
		gasto.setId(this.id);
		gasto.setMonto(this.monto);
		gasto.setDetalle(this.detalle);
		gasto.setFolio(this.folio);
		gasto.setTipo(this.tipo);
		gasto.setEdificio(this.edificio);
		return gasto;
	}
	
	// ~~ getters y setters ========================================================

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getHierarchy() {
		return hierarchy;
	}

	public void setHierarchy(String hierarchy) {
		this.hierarchy = hierarchy;
	}

	public BigDecimal getMonto() {
		return monto;
	}

	public void setMonto(BigDecimal monto) {
		this.monto = monto;
	}

	public String getDetalle() {
		return detalle;
	}

	public void setDetalle(String detalle) {
		this.detalle = detalle;
	}

	public String getFolio() {
		return folio;
	}

	public void setFolio(String folio) {
		this.folio = folio;
	}

	public TipoGasto getTipo() {
		return tipo;
	}

	public void setTipo(TipoGasto tipo) {
		this.tipo = tipo;
	}

	public Boolean getConsolidado() {
		return consolidado;
	}

	public Edificio getEdificio() {
		return edificio;
	}

	public void setEdificio(Edificio edificio) {
		this.edificio = edificio;
	}

	public String getRazonSocial() {
		return razonSocial;
	}

	public void setRazonSocial(String razonSocial) {
		this.razonSocial = razonSocial;
	}

	public String getNroFactura() {
		return nroFactura;
	}

	public void setNroFactura(String nroFactura) {
		this.nroFactura = nroFactura;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public String getFormaPago() {
		return formaPago;
	}

	public void setFormaPago(String formaPago) {
		this.formaPago = formaPago;
	}

	public Integer getAnio() {
		return anio;
	}

	public void setAnio(Integer anio) {
		this.anio = anio;
	}

	public Integer getMes() {
		return mes;
	}

	public void setMes(Integer mes) {
		this.mes = mes;
	}

	public Gasto getGasto() {
		return gasto;
	}

	public void setGasto(Gasto gasto) {
		this.gasto = gasto;
	}
}
